<?php

namespace App\Http\Controllers\Home;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use DB;
use Session;
use App\Http\Controllers\Home\ComController;

class CartController extends Controller
{
    
	// 购物车 列表
	public function index()
	{
		if( Session::has('cart') )
		{
			
			// 获得购物车里的商品集合
			$carts = Session::get('cart');
			// 获取商品集合
			$coms = array();
			// 每个商品的 购买量
			$nums = array();
			foreach( $carts as $key => $com )
			{
				if( !in_array( $com['id'],$coms ) )
				{
					$coms[ $com['id'] ]=$com['id'];
					$nums[ $com['id'] ]=$com['num'];
				}else
				{
					$nums[ $com['id'] ] += $com['num'];
					$stock_info = ComController::getStock( $com['id'] );
					// 添加的数量 超过了 实际库存
					if( $nums[ $com['id'] ] > $stock_info->stock )
					{
						// 等于最大库存
						$nums[ $com['id'] ] = $stock_info->stock;
					}
				}
			}
			// 商品 内容
			$coms_info = DB::table('com as c')
						->select( "c.*",'cp.pic_url' )
						->leftJoin( 'com_pic as cp','cp.sku','=','c.id' )
						// 指定 商品
						->whereIn('c.id', $coms )
						// 主图
						->where('cp.type','=',1)
						->get();
			
		}else
		{
			$coms_info=array();
			$nums=array();
		}
		
		// 加载页面
		return view("Home.cart.list",[ 'coms_info' => $coms_info,'nums'=>$nums ]);
	}
	
	// 商品详情页 购物车 只能 操作 添加 数量只能加1
	// 商品列表页 购物车 只能 操作 添加 数量为（1 -- 库存）
	// 购物车列表 购物车 可以 加1 减1 （设置购买量 见updateCart方法 ）
	// 购物车列表 减的按钮 $opration='del' $com['num']=-1
	public function insertCart( $opration='add',Request $request)
	{
		// 1. 包含商品 id 和 购买数量 num
		$com = $request -> except('_token');
		// 2. 获取要添加商品的 库存 
		$stock_info = ComController::getStock( $com['id'] );
		// 没有库存
		if( $stock_info->stock < 1 )
		{
			return('该商品暂无库存');
		}
		// 添加操作 不能为负
		if( $opration=='add' )
		{
			// 输入 0 负数
			if( $com['num'] < 1 )
			{
				return('请选择商品数量');
			}
		}
		
		// session 里有 购物车
		if( Session::has('cart') )
		{
			// 3. 取得 购物车 现有的 商品集合
			$carts = Session::get('cart');
			$coms = array();
			$nums = array();
			foreach( $carts as $key => $cart_com )
			{
				if( !in_array( $cart_com['id'],$coms ) )
				{
					// $coms[1]=1;
					$coms[ $cart_com['id'] ]=$cart_com['id'];
					// $nums[1]=2;
					$nums[ $cart_com['id'] ]=$cart_com['num'];
				}else{
					$nums[ $cart_com['id'] ] += $cart_com['num'];
				}
			}
			
			// 4. 要添加的商品 已在购物车里 
			if( in_array( $com['id'],$coms ) )
			{
				// 更改数量
				$nums[ $com['id'] ] += $com['num'];
				// 加后 是否大于库存
				if( $nums[ $com['id'] ] > $stock_info->stock )
				{
					// 等于最大库存
					$nums[ $com['id'] ] = $stock_info->stock;
				}
				// 修改session里的 这个商品数量
				foreach( $carts as $key => $cart_com )
				{
					// 找到这个商品
					if( $cart_com['id']==$com['id'] )
					{
						// 商品的旧购买量
						$old = $cart_com['num'];
						// 增加量
						$add = $nums[ $com['id'] ] - $old;
						// session里 商品设置新购买量
						$carts[$key]['num'] = $nums[ $com['id'] ];
						//  获取原来的 购物车 商品总数量
						$cartTotal = Session::get('cartTotal');
						$cartTotal += $add;
						// 3. 设置 购物车 商品总数量
						Session::put( 'cartTotal',$cartTotal );
						break;
					}
				}
				// 清除一下
				Session::forget('cart');
				Session::put('cart',$carts);
				return('已添加至购物车');
			}else
			{
				// 要添加的商品 不在购物车里 
				// 输入大于库存
				if( $com['num'] > $stock_info->stock )
				{
					// 等于最大库存
					$com['num'] = $stock_info->stock;
				}
				// 1. 把商品 push到购物车session中
				Session::push( 'cart',$com  );
				// 2. 获取原来的 购物车 商品总数量
				$cartTotal = Session::get('cartTotal');
				$cartTotal += $com['num'];
				// 3. 设置 购物车 商品总数量
				Session::put( 'cartTotal',$cartTotal );
				return('已添加至购物车');
			}
			
		}else{
			// 购物车 为空
			// 3. 购买量 和 库存 比较
			// 输入大于库存
			if( $com['num'] > $stock_info->stock )
			{
				// 等于最大库存
				$com['num'] = $stock_info->stock;
			}
			
			// 2. 把商品 添加到购物车session中
			Session::put( 'cart',[ $com ] );
			// 3. 设置 购物车 商品总数量
			Session::put( 'cartTotal',$com['num'] );
			return '已添加至购物车';
		}
	}
	
	// 购物车列表 用户输入 直接修改购买量
	public function updateCart(Request $request)
	{
		// 1. 包含商品 id 和 购买数量 num
		$com = $request -> except('_token');
		// 2. 获取要添加商品的 库存 
		$stock_info = ComController::getStock( $com['id'] );
		// 没有库存
		if( $stock_info->stock < 1 )
		{
			return('该商品暂无库存');
		}
		// 输入 0 负数
		if( $com['num'] < 1 )
		{
			return('请选择商品数量');
		}
		// 输入大于库存
		if( $com['num'] > $stock_info->stock )
		{
			// 等于最大库存
			$com['num'] = $stock_info->stock;
		}
		
		// 如果有session
		if( Session::has('cart') )
		{
			// 3. 取得购物车现有的 商品集合
			$carts = Session::get('cart');
			foreach( $carts as $key => $cart_com )
			{
				// 如果找到
				if( $cart_com['id']==$com['id'] )
				{
					// 商品的旧数量 5
					$old = $cart_com['num'];
					// 直接设置 新的 购买量 20/2
					$carts[$key]['num'] = $com['num'] ;
					// 差
					// 15 / -3
					$diff = $com['num'] - $old;
					// 4. 获取原来的 购物车 商品总数量
					$cartTotal = Session::get('cartTotal');
					$cartTotal += $diff;
					// 3. 设置 购物车 商品总数量
					Session::put( 'cartTotal',$cartTotal );
					break;
				}
				
			}
			// 清除一下
			Session::forget('cart');
			Session::put('cart',$carts);
			return '修改成功';
		}
	}
	
	// 删除购物车 中的某个商品
	public function delCart(Request $request)
	{
		// 包含商品 id 
		$com = $request -> except('_token');
		// session 里有 购物车
		if( Session::has('cart') )
		{
			// 1. 取得购物车现有的 商品集合
			$carts = Session::get('cart');
			foreach( $carts as $key => $cart_com )
			{
				// 如果找到
				if( $cart_com['id']==$com['id'] )
				{
					// 商品的旧数量
					$old = $cart_com['num'];
					// 2. 获取原来的 购物车 商品总数量
					$cartTotal = Session::get('cartTotal');
					$cartTotal -= $old;
					// 3. 设置 购物车 商品总数量
					Session::put( 'cartTotal',$cartTotal );
					// 删除商品
					unset( $carts[$key] );
					break;
				}
				
			}
			
			// 删除这件后 购物车里还有其他商品
			if( count($carts)>0 )
			{
				// 清除一下
				Session::forget('cart');
				Session::put('cart',$carts);
			}else
			{
				// 购物车已空
				Session::forget('cart');
			}
			
			return '删除成功';
		}
	
	}
	
	// 清空购物车
	public function delAll()
	{
		// 清空购物车
		Session::forget('cart');
		Session::forget('cartTotal');
		return '删除成功';
	}
	
	
	// 商品结算页面 生成订单页面
	public function goToPay(Request $request)
	{
		// 判断是否登录
		if( Session::has('user_id') )
		{
			// 登录了
			/* echo Session::get('user_id'); */
			// 获得购物车里的商品集合
			$carts = Session::get('cart');
			// 获取商品集合
			$coms = array();
			// 每个商品的 购买量
			$nums = array();
			foreach( $carts as $key => $com )
			{
				if( !in_array( $com['id'],$coms ) )
				{
					$coms[ $com['id'] ]=$com['id'];
					$nums[ $com['id'] ]=$com['num'];
				}else
				{
					$nums[ $com['id'] ] += $com['num'];
					$stock_info = ComController::getStock( $com['id'] );
					// 数量 超过了 实际库存
					if( $nums[ $com['id'] ] > $stock_info->stock )
					{
						// 等于最大库存
						$nums[ $com['id'] ] = $stock_info->stock;
					}
				}
			}
			// 购买商品 内容
			$coms_info = DB::table('com as c')
						->select( "c.*",'cp.pic_url' )
						->leftJoin( 'com_pic as cp','cp.sku','=','c.id' )
						// 指定 商品
						->whereIn('c.id', $coms )
						// 主图
						->where('cp.type','=',1)
						->get();
			// 总金额
			$need_to_pay = 0;
			foreach( $coms_info as $key=>$com_info )
			{
				$need_to_pay += $com_info->price * $nums[$com_info->id];
			}
			
			// 所有 付款方式
			$all_pay = DB::table('payment')->get();
			// 所有 施工部人员
			$all_admin = DB::table('admin')
							-> where('department_id','=',1)
							-> get();
			
			// 订单 页面
			return view('Home.order.add',[ 'coms_info' => $coms_info,'nums'=>$nums,'need_to_pay'=>$need_to_pay,'all_pay'=>$all_pay,'all_admin'=>$all_admin ]);
		}
		else
		{
			// 未登录 跳转到登录页面
			return redirect('/login/next_url');
		}
	
	}
	
}
